package jmcnet.libcommun.jmcnetds.flex
{
	import com.adobe.cairngorm.commands.ICommand;
	import com.adobe.cairngorm.control.CairngormEvent;
	
	import flash.utils.getQualifiedClassName;
	
	import jmcnet.libcommun.logger.JMCNetLogger;

	public class BaseCommand implements ICommand, IJMCNetCommand
	{
		private var _event:BaseEvent=null;
		
		public function BaseCommand() {
			if ( getQualifiedClassName(super) == "BaseCommand" )
            	throw new UninitializedError("La classe BaseCommand est abstraite et ne peut pas être instanciée"); 
		}

		public function execute(event:CairngormEvent):void	{
			JMCNetLogger.info("Appel BaseCommand:execute");
			_event = event as BaseEvent;
			onExecute(_event);
		}
		
		public function get event():BaseEvent { return _event;}
		
		/**
		 * Callback appelé par le controller (et donc indirectement par la vue) lors d'un besoin d'appel à un service.
		 * Cette méthode est traditionnellement implémentée avec l'appel au Delegate. 
		 */
		public function onExecute(event:BaseEvent):Boolean	{
			throw new UninitializedError("Methode onExecute non implementée");
		}
		
		/**
		 * Callback appelé par le Delegate lors d'une réception d'un résultat.
		 * Le résultat peut être de type Xml (jmcnetDS) ou un DTO dans le cas de BlazeDS
		 * 
		 */
		public function onResult(obj:Object):Boolean {
			throw new UninitializedError("Methode onResult non implementée");
		}
		
		/**
		 * Callback appelé par le Delegate lors de la survenue d'une FonctionnalError remontée par le service
		 */
		public function onFonctionnalError(codeRetour:uint, error:Error, obj:Object):void {
			throw new UninitializedError("Methode onFonctionnalError non implementée");
		}
		
		/**
		 * Callback appelé par le Delegate lors de la survenue d'une TechnicalError remontée par le service ou lors de l'appel
		 */
		public function onTechnicalError(error:Error, obj:Object):void {
			throw new UninitializedError("Methode onTechnicalError non implementée");
		}
	}
}